(function($){
	var defaults = {
		//EVENTOS
		'trigger':'autocomplete', 	//'blur' 'change'  evento que lanza la búsqueda de datos
		//'search_auto_complete':true,	//false		utilizar funcion de autocompletado
		'search_modal':true,			//false		utilizar ventana modal para búsqueda de proveedor
		//UI input
		'search_button':'search.png', 		//usar icono para ventana de búsqueda de datos
		'search_button_pos':'after',		//'before'	posición del icono de búsqueda
		//AJAX
		'aditional_parameters':{},	//parametros adicionales para el envio de datos
		'url':'proveedores/buscar',	//url de busqueda de proveedores
		'method':'post',			//'get'
		'clear_on_error':true, 		//limpiar datos en caso de error
		//SEARCH window
		'search_window_title':'Buscar Proveedor',	//título de ventana modal
		'modal':false,				//true bloquear ui
		'position':'center',		//'center','left','right','top','bottom' ['right','top'] [0,123] jQuery Dialog position
		'zIndex':1000,
		//AUTOCOMPLETE
		'minlength':3,				//longitud mínima para empezar a buscar por autocompletado
		'maxitems':10,				//cantidad máxima de resultados para el autocompletado
		//UI output
		'fill_fields':{},		//llenar otros campos	{'CampoId1':'Modelo.campo1', 'CampoId2':'Modelo.campo2 Modelo2.campo1'}
		'loader_pos':'next', 		//'before','class','none'    posición del loader al cargar ajax.
		'loader':'ajax1.gif'  		//'clase',	//muestra la imagen loader o usa una clase mientras se carga...
	};
	$.fn.buscarProveedor = function(action, options){
		if(typeof(action) == 'object'){
			options = action;
			action = 'initialize';
		}
		
		this.each(function(){
			el = $(this);
			setOptions(el);
			opts = el.data('buscar_proveedor:options');
			
			if(opts.search_modal === true && jQuery().dialog){
				add_search_button(el);
			}
			
			switch(opts.trigger){
				case 'blur':
				case 'change':
					break;
				case 'autocomplete':
				default:
					add_auto_complete(el);
			}
			
			if(el.val()){
				search(el, el.val(), function(data){
					data = data[0];
					setSelectedData(el, data);
					fill_data(el);
					remove_ajax_loader(el);
				});
			}
			
			switch(action){
				case 'initialize': //inicializar
					
					break;
			}
		});
		
		function search_on_blur(el){
			opts = el.data('buscar_proveedor:options');
			
		};
		
		function search_on_change(el){
			opts = el.data('buscar_proveedor:options');
			
		};
		
		function add_auto_complete(el){
			options = el.data('buscar_proveedor:options');
			//verificando que el plugin de auto complete existe
			if (typeof jQuery.autoComplete != 'object'){
				alerta('no se ha cargado el plugin jQuery auto complete','error');
			} else {
				auto_complete(el);
			}
		};
		
		function auto_complete(el){
			opts = el.data('buscar_proveedor:options');
			postdata = $.extend({}, opts.aditional_parameters, {'autocomplete':1});
			el.autoComplete({
				ajax:opts.url,
				postVar:'q',
				postData:postdata,
				minChars:opts.minlength,
				maxItems:opts.maxitems,
				width:300,
				onSelect:function(evt, ui){
					append_ajax_loader(el);
					//search(el, ui.data.value, function(data){
					search(el, el.val(), function(data){
						data = data[0];
						setSelectedData(el, data);
						fill_data(el);
						remove_ajax_loader(el);
					});
				},
				onShow:function(evt, ui){
					remove_ajax_loader(el);
				},
				onSubmit:function(evt, ui){
					remove_ajax_loader(el);
					append_ajax_loader_to_object(el);
				}
			});
		};
		
		function setOptions(el){
			options = $.extend({}, defaults, el.data('buscar_proveedor:options'),options);
			el.data('buscar_proveedor:options', options);
		};
		
		function setSelectedData(el, selected_data){
			removeSelectedData(el);
			el.data('buscar_proveedor:selected_data', selected_data);
		};
		
		function getSelectedData(el){
			return el.data('buscar_proveedor:selected_data');
		}
		
		function removeSelectedData(el){
			el.removeData('buscar_proveedor:selected_data');
		};
		
		function add_search_button(el){
			opts = el.data('buscar_proveedor:options');
			$button = $('<img src="'+_WEB_ROOT+'img/'+ opts.search_button +'" width="15" height="15" style="cursor:pointer;width:15px;height:15px;border:none" alt="buscar" title="buscar proveedor" />')
				.click(function(){open_search_form(el);});
			switch(opts.search_button_pos){
				case 'after':
					el.after($button);
					break;
				case 'before':
					el.before($button);
					break;
				default:
					el.after($button);	//--> este puede ser cambiado a otro por defecto
			}
		};
		
		function open_search_form(el){
			opts = el.data('buscar_proveedor:options');
			
			$('<div class="d-header">' + 
				'<input name="data[q]" type="text" value="'+ el.val() +'" style="width: 450px; margin:10px; margin-top: 12px;" id="q">'+
				'<br /><select style="width: 450px; margin:10px; margin-top:0px;" id="resultados" size="5" name="list"></select>'+
			  '</div>')
			.dialog({
				title:opts.search_window_title,
				width:500,
				height:240,
				hide:'slide',
				resizable: 'width',
				modal:opts.modal,
				position:opts.position,
				zIndex:opts.zindex,
				buttons:{
					'Cerrar':function(){
						$(this).dialog('close');
					},
					'Buscar':function(){
						$dialog = $(this);
						//restableciendo datos del resultado de busqueda
						$select = $(this).find('select').addClass('ajax_load2').html('');
						
						//realizando la búsqueda
						append_ajax_loader(el);
						
						search(el, $(this).find('#q').val(), function(data){
							$select.removeClass('ajax_load2');
							if(data){
								if(!data.Error){
									opciones = '';
									for(var i in data){
										opciones += '<option value="'+ i +'" title="PROVEEDOR: '+data[i].Tercero.razon_social+'">['+ data[i].Proveedore.codigo +'] [RAZ. SOCIAL:'+ data[i].Tercero.razon_social + ']</option>';
									}
									
									$select.html(opciones);
									$select.find('option').dblclick(function(){
										i = this.value;
										//selected_data = data[i];
										setSelectedData(el, data[i]);
										//verificando que fill_fields tenga propiedades
										var c = 0;
										for (var i in opts.fill_fields){
											c=1; break;
										}
										if(c === 0){
											if(typeof alerta == 'function'){
												alerta('No se especificaron campos a llenar', 'Error');
											} else {
												alert('No se especificaron campos a llenar')
											}
										} else {
											fill_data(el);
										}
										$dialog.dialog('close');
									});
								}
							}
							remove_ajax_loader(el);
							
						});
						
					}
				},
				open:function(){
					$btnbuscar = $('button:contains(Buscar):visible','.ui-dialog-buttonpane');
					$btncerrar = $('button:contains(Cerrar):visible','.ui-dialog-buttonpane');
					//si el recuadro de busqueda tiene un valor realizar la búsqueda inmediatamente despues de la carga de la ventana
					if($(this).find('input:text').val().trim().length){
						$btnbuscar.trigger('click');
					}
					$(this)
						//agregando sombreado a ventana
						.parent().css({
							'-moz-box-shadow':'0 0 1em gray',
							'-webkit-box-shadow':'0 0 1em gray',
							'box-shadow':'0 0 1em gray'
						}).end()
						//al presionar enter realice la busqueda
						.find('input:text').focus().keyup(function(e){
							if(e.keyCode == 13) {
								$btnbuscar.trigger('click');
							}
						});
					//agregando icono a los botones cerrar y buscar
					if(!$btncerrar.find('span.ui-icon').length){
						$btncerrar.prepend('<span style="float:left;margin-right:10px" class="ui-icon ui-icon-cancel" />');
					}
					
					if(!$btnbuscar.find('span.ui-icon').length){
						$btnbuscar.prepend('<span style="float:left;margin-right:10px" class="ui-icon ui-icon-search" />');
					}
					
				},
				close:function(){
					//eliminar la ventana del DOM
					$(this).remove();
				}
			});
			
			
		};
		
		function disable_autocomplete(el){
			el.autoComplete('disable');
		};
		
		function enable_autocomplete(el){
			el.autoComplete('enable');
		};
		
		function search(el, query, callback){
			opts = el.data('buscar_proveedor:options');
			data = $.extend({}, opts.aditional_parameters, {'q': query});
			$.ajax({
				'url': opts.url,
				'type': opts.method,
				'data': data,
				'dataType': 'json',
				'async': false,
				'error': function(){
					if (typeof alerta === 'function'){
						alerta('Hubo un error al buscar datos', 'Error');
					} else {
						alert('Hubo un error al buscar datos');
					}
					if (opts.clear_on_error){
						clear_fields(el);
						removeSelectedData(el);
					}
				},
				'success': callback
			});
		};
		
		function fill_data(el){
			data = el.data('buscar_proveedor:selected_data');
			//data = selected_data;
			clear_fields(el);

			//creando un objeto con los nombres largos...
			//pej. Proveedore.codigo
			test = {};
			for(var i in data){
				if(typeof data[i] == 'object' && data[i] != null){
					for(var j in data[i]){
						if(typeof data[i][j] == 'object' && data[i][j] != null){
							for(var k in data[i][j]){
								test[i+'.'+j+'.'+k] = data[i][j][k];
							}
						} else {
							test[i+'.'+j] = data[i][j];
						}
					}
				} else {
					test[i] = data[i];
				}
			}

			opts = el.data('buscar_proveedor:options');
			//el.val(data.Proveedore.codigo);
			
			//obteniendo una copia de la lista de objetos a llenar
			campos = $.extend({},opts.fill_fields);
			
			f2 = campos;
			for(var i in f2){
				for(var j in test){
					f2[i] = f2[i].replace(j, test[j]);
				}
				try{
					$obj = $('#'+i);
					//verificando si es objeto de formulario o u objeto html
					if($obj[0].type == 'checkbox' || $obj[0].type == 'text' || $obj[0].type == 'textarea' || $obj[0].type == 'select-one' || $obj[0].type == 'select-multiple'){
						$obj.val(f2[i]);
					} else {
						$obj.text(f2[i]);
					}
				} catch(err) {
					if(typeof alerta == 'function'){
						alerta('no se pudo asignar valor en ' +i,'error');
					} else {
						alert('no se pudo asignar valor en ' + i);
					}
				}
			}
			
		};
		
		function clear_fields(el){
			opts = el.data('buscar_proveedor:options');
			fields = opts.fill_fields;
			for(var i in fields){
				try{
					$('#'+i).val('').text('');
				} catch(err) {
					if(typeof alerta == 'function'){
						alerta('no se pudo ubicar el objeto: ' + i, 'Error');
					} else {
						alert('no se pudo ubicar el objeto');
					}
				}
			}
		}
		
		function append_ajax_loader(el){
			opts = el.data('buscar_proveedor:options');
			objs = '';
			
			//obteniendo lista de objetos, exeptuando los ocultos al usuario
			for(var i in opts.fill_fields){
				objs += '#'+ i + ':visible,';
			}
			$objs = $(objs);
			
			
			$loader = '<img class="buscar_proveedor_loader" src="'+_WEB_ROOT+'img/'+ opts.loader +'" alt="..." />';
			switch(opts.loader_pos){
				case 'none':
					//no se agrega loader
					break;
				case 'before':
					$objs.before($loader);
					break;
				case 'class':
					$objs.addClass(opts.loader);
					break;
				case 'next':
				default:
					$objs.after($loader);
			}
		};
		
		function append_ajax_loader_to_object(el){
			opts = el.data('buscar_proveedor:options');
			el.after('<img class="buscar_proveedor_loader" src="'+_WEB_ROOT+'img/'+ opts.loader +'" alt="..." />');
		};
		
		function remove_ajax_loader(el){
			opts = el.data('buscar_proveedor:options');
			$('img.buscar_proveedor_loader').remove();
			$('.'+ opts.loader).removeClass(opts.loader);
		};
		
		return this;
	}
})(jQuery);